package com.qfedu.job;

import com.qfedu.job.listeners.MyJobListener;
import com.qfedu.job.listeners.MyTriggerListener;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.matchers.GroupMatcher;
import org.quartz.impl.matchers.KeyMatcher;

import java.util.Date;

public class QuartzTest {
    public static void main(String[] args) {

        try {
            // 1. 创建Quartz的任务调度器
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

            // 2. 创建触发器：定义了任务调度的时机（延时、循环、定时...）
            // simpleScheduleBuilder 对象表示任务的触发规则
            SimpleScheduleBuilder simpleScheduleBuilder =
                    SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(3).withRepeatCount(10);

            // 创建一个触发器 trigger：用于定义任务调度的规则。(使用链式调用编程)
            SimpleTrigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity("trigger1", "group1")         // withIdentity 设置trigger唯一标识
                    .startAt(new Date(System.currentTimeMillis() + 5000))   // startAt 设置首次触发时间
                    .withSchedule(simpleScheduleBuilder)                    // withSchedule 设置触发器的触发规则
                    .usingJobData("key1", "value1")           // 设置Trigger参数
                    .build();                                               // 通过TriggerBuilder对象，构造Trigger对象

            // 3. 创建任务（JobDetail 用于封装具体的任务）
            JobDetail job = JobBuilder.newJob(MyJob.class)
                    .withIdentity("job1", "group1")    // 设置任务的标识
                    .usingJobData("key2", "value2")  // 设置JobDetail参数
                    .build();

            // 将任务（job）和触发器（trigger）注册到调度器（scheduler）中，使得调度器能够根据触发器定义的规则执行任务。
            scheduler.scheduleJob(job, trigger);

            // 注册任务监听器，把监听器 MyJobListener 注册到当前任务的调度器中：
            // a. 由于没有指定某一个任务，所以会监听当前调度器上的所有任务
            scheduler.getListenerManager().addJobListener(new MyJobListener());
            // b. 监听group1任务组中的所有任务
            // scheduler.getListenerManager().addJobListener(new MyJobListener(), GroupMatcher.jobGroupEquals("group1"));
            // c. 监听某个任务
            // scheduler.getListenerManager().addJobListener(new MyJobListener(), KeyMatcher.keyEquals(new JobKey("job1", "group1")));

            // 注册触发器监听器
            scheduler.getListenerManager().addTriggerListener(new MyTriggerListener());

            // 启动任务
            scheduler.start();

            // 暂停所有任务
            // scheduler.pauseAll();

            // 继续所有任务
            // scheduler.resumeAll();

            // 停止任务
            // scheduler.shutdown();

        } catch (SchedulerException e) {
            throw new RuntimeException(e);
        }

    }
}
